﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Threading;

namespace Skyttespill
{
    public class Target : MovingObject
    {
        private float vx, vy;
        SkPanel panel;
        Random r = new Random();
        private Point skytepunkt;

        public Target(SkPanel _panel, int targetSize, int targetSpeed, Color target_color, List<Hinder> hindere) 
        {
            // Farge og størrelse av målene
            diameter = targetSize;
            panel =  _panel;
            skytepunkt = _panel.skyttpunkt;
            color = new SolidBrush(target_color);

            // Løkka forhindrer å opprette et mål som interferer med hindene og kanonen
            do
            {
                x = r.Next(0, panel.Width);
                y = r.Next(0, panel.Height);
            } while (checkLocation(ref hindere));

            vx = r.Next(-targetSpeed, targetSpeed);
            vy = r.Next(-targetSpeed, targetSpeed);
        }

        // Sjekker to punkter hvis target treffer hinder
        // Returnerer false, hvis target opprettes borte fra kanon og ikke overlapper hindene 
        private bool checkLocation(ref List<Hinder> hindere)
        {
            Point p = new Point(Convert.ToInt16(x), Convert.ToInt16(y));
            Point p2 = new Point(p.X + diameter, p.Y + diameter);
            Point p3 = new Point(p.X, p.Y + diameter);
            Point p4 = new Point(p.X + diameter, p.Y);
            Rectangle rect_check;
            foreach (Hinder hin in hindere)
            {
                rect_check = new Rectangle(Convert.ToInt16(hin.X), Convert.ToInt16(hin.Y), hin.Width, hin.Height);
                if ((rect_check.Contains(p))||(rect_check.Contains(p2)))
                    return true;
                if ((rect_check.Contains(p3)) || (rect_check.Contains(p4)))
                    return true;
            }

            // Sjekker hvis mål opprettes i nærheten av kanonen
            rect_check = new Rectangle(skytepunkt.X - 75, skytepunkt.Y - 75, 150, 150);
            if ((rect_check.Contains(p)) || (rect_check.Contains(p2)))
                return true;

            return false;
        }

        // X
        public float VX 
        {
            get { return vx; }
            set { vx = value; }
        }

        // Y
        public float VY
        {
            get { return vy; }
            set { vy = value; }
        }

        // Bevegelse av mål i løkke
        public override void Move()
        {

            while (Active)
            {
                x += vx;
                y += vy;
                
                Size panelSize = panel.ClientRectangle.Size;
                if (x < 0)
                    Krash();

                if (x + diameter >= panelSize.Width)
                    Krash();

                if (y < 0)
                    Krash();

                if (y + diameter >= panelSize.Height)
                    Krash();
                Thread.Sleep(17);
            }
        }

        public override void tegn(Graphics g)
        {
            g.FillEllipse(color, Rectangle());
        }
    }
}
